// Buffer 对象主要是处理我们二进制数据的， node中为了拥有实现操作文件的能力，提供了一个buffer类型，可以和字符串相互转化
// 数据存储都是采用2进制来存储的  01， 1个字节有八个位（bit）  -> 16进制 (无论是几进制描述的内容是一样的)

// 进制转化 （js中有方法可以直接实现）

const path = require('path');
console.log(parseInt('0011',2)); //  将2进制转换成10进制
// > 当前这一位的值 * 用当前进制^所在位  累加可以转化成10进制

// 将10进制转成任意进制 取余的方式
console.log(255..toString(16)); // 可以将任意进制转化成任意进制 toString会转化成字符串 

const fs = require('fs');
// fs.readFile(path.resolve(__dirname,'file.txt'),function(err,data){
//     console.log(data); // 16进制    49 43 50
// })
// 编码问题 （内部会按照规则 存储）
// -  ASCII 一个字节有8个位（255） ascii他只用了7个位（127）
// -  GB2312 两个字节来描述一个汉字   (128-255) * (128-255) 用来表示汉字  16129
// -  GBK   (128-255)* 255 = 32385 (理论值)
// -  GB18030  修改了，增加了繁体等等，全面了

// unicode 16位来表示所有的字符 （将所有的文字重排重写）
// utf8 将内容分割成不同的 1-4个 字节来进行表示  （1个字符，就是一个字节， 一个汉字是三个字节）

// 额外扩充 如何将unicode转化成utf8的    utf8-> unicode (编码就是按照不同的规则进行编码)
// md5 并不是加密算法   加密（按照规则来解密）。 编码（大家都知道的规则） 。 摘要（不可逆的）

// 摘要 sha256 md5 sha1
// 加密像常见的 非对称、对称 
// 编码 base64编码 base32 




// base64编码解决的问题 （中文在传输的过程中会出现乱码的问题） 可以替代任何src的位置
// 字符、文字、图片编码的方式都不同的
// base64 和base64url 的区别 url是不能出现+=/的
console.log(Buffer.from('我'))

// 进制的表示  0b二进制   0o八进制  0xe6
console.log((0xe6).toString(2))
console.log((0x88).toString(2))
console.log((0x91).toString(2))

console.log(parseInt('111001',2))
console.log(parseInt('101000',2))
console.log(parseInt('100010',2))
console.log(parseInt('010001',2))

// 57 40 34 17

let code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
code+= code.toLowerCase()
code+= '0123456789+/'
console.log(code[57] + code[40] + code[34] + code[17])
// 11111111  11111111  11111111  = 3 *  8
//  0001111   00011111  00011111    00011111    = 6 * 4
// 最终提供64个编码 将内容按照编码进行转化
// base64编码后的结果会比之前大，会大1/3


 // 在node中所有的内容都是以utf8为编码的，node中不支持bgk

 const lite = require('iconv-lite');
fs.readFile(path.resolve(__dirname,'file.txt'),function(err,data){
    ; // 16进制    49 43 50
    // gbk  -> utf8 核心编码

    const content = lite.decode(data,'gb18030')

    console.log(content)
})



// console.log((255-128) * (255-128));  // 目前用的比较多的编码 utf8 (一个字节点的时候采用的都是 ascii编码)

// 会将内容按照2进制的方式来存储，2进制比较长 ，所以最终展现给我们的是16进制 






 // 任意进制转化成任意进制 （整数）
 // 0.1 + 0.2  为什么 不等于 0.3 （小数之间的转化）  乘2取余

 console.log(0.3.toString(2))   // 在计算的过程中，也是近似值的计算

 // 0.001100110011001100110011001100110011001100110011001101
 // 0.0001100110011001100110011001100110011001100110011001101

//  0.1 * 2 = 0.2  -> 0
//  0.2 * 2 = 0.4  -> 0
//  0.4 * 2 = 0.8  -> 0
//  0.8 * 2 = 1.6  -> 1
//  0.6 * 2 = 1.2  -> 1
//  0.2 * 2 = 0.4  -> 0

